WebGL

Architecture WebGL

Le pipeline de rendu

L'API WebGL utilise deux types de primitives :

Pour générer une image à partir de ces primitives, WebGL utilise une architecture en Pipeline :

Pipeline WebGL


Analysons en détail la figure au-dessus :

Il faut noter qu'une paire de shader équivaut à un programme de shaders; le vertex shader et le fragment shader sont indissociables. Ils sont écris en langage GL/SL puis compilés et linkés après la création du contexte GL. Enfin, ils sont executés sur la carte graphique. On peut utiliser plusieurs programmes de shaders pour le rendu d’une même scène. On travaille avec des triangles =plus petite géométrie pour définir un plan 3D.



La figure ci-dessous reprend le pipeline du WebGL :
Pipeline WebGL vu différemment




Le processus commence par la création des vertex arrays. Ce sont des tableaux qui contiennent des attributs de vertex comme l'emplacement du sommet dans l'espace 3D et des informations sur le sommet(texture, couleur ou façon dont il sera affecté par l'éclairage (vecteur normal)). Ces tableaux et les informations qu'ils contiennent sont créés dans JavaScript avec plusieurs façons possibles : traitement des fichiers qui décrivent un modèle 3D , création des données à partir de zéro, ou en utilisant une bibliothèque qui fournit des vertex arrays pour formes géométriques.

Ensuite les données contenant l'ensemble sommets sont envoyées au processeur graphique en alimentant un ou plusieurs tampons de sommet. Quand un travail de rendu est soumis, il faut également fournir un tableau supplémentaire d'indices qui pointent vers les éléments d'un tableau de vertex. Ils contrôlent la façon dont les sommets seront assemblés en triangles plus tard. Le GPU commence par la lecture de chaque sommet sélectionné sur le vertex buffer et en l'exécutant à travers le vertex shader. Le vertex shader est un programme qui prend un ensemble d'attributs de vertex comme entrées et produit en sortie un nouvel ensemble d'attributs. Au minimum, le vertex shader calcule la position projetée du sommet dans l'espace écran. Mais il peut aussi générer d'autres attributs tels que la couleur ou les coordonnées de texture pour chaque sommet. Vous pouvez coder votre propre shader de sommet ou utiliser celui fourni par une bibliothèque WebGL. Le GPU connecte alors les sommets projetés et forme des triangles(plus petite géométrie pour définir un plan 3D). Elle le fait en prenant les sommets dans l'ordre indiqué par le tableau d'indices et les regroupe en ensembles de trois.

La rasterisation prend chaque triangle, les découpe et rejette ceux qui sont en dehors de l'écran, et morcelle les parties restantes visibles en pixels de la taille des fragments. En sortie du vertex shader, les attributs sont interpolées sur la surface tramée de chaque triangle, en assignant un gradient lisse de valeurs pour chaque fragment. Par exemple, si le vertex shader attribue une valeur de couleur à chaque sommet, le module de rastérisation mélangera ces couleurs dans un dégradé de couleurs appropriées sur la surface pixélisée. Les pixels générés (ou fragments) passent ensuite par un autre programme appelé le fragment shader. Le fragment shader génère des valeurs de couleur et de profondeur pour chaque pixel et envoie ces infos au framebuffer. Les opérations communes du shader de fragments comprennent le mapping de texture et l'éclairage. Le fragment shader s'exécute indépendamment pour chaque pixel dessiné, il peut exécuter les effets spéciaux les plus sophistiqués, mais il est aussi la partie la plus sensible des performances du pipeline graphique. Comme avec le vertex shader, vous pouvez coder votre propre fragment shader ou utiliser celui fourni par une bibliothèque WebGL.

Le framebuffer est la destination finale du processus de rendu. Un framebuffer traite plus qu’une siple image 2D : en plus d'un ou plusieurs tampons de couleur, un framebuffer peut avoir un tampon de profondeur et d’autres filtres qui s’appliqueront à l’image. Le rendu est soit affiché à l’écran soit crée une nouvelle texture utilisable par un programme webGL.